;*********************************************************** ; A/D変換動作チェックプログラム(1) ; A/D変換入力端子(CH0/RA0) ; A/D変換の結果はLED点灯により確認 ; RB1(MSB),RB0,RD7,RD6,RD5,RD4,RD3,RD2,RD1,RD0(LSB) ; の10ビット ; A/D 割り込みは使用せず、簡単のため GO ビットで判断 ;*********************************************************** LIST P=PIC16F877 ; プロセッサの種別指定 INCLUDE "P16F877.INC" ; インクルードファイルの指定 ;*********************************************************** ; 変数定義とレジスタ割付 ;*********************************************************** COUNT EQU 20H ; ループカウンタ ORG 0 ; プログラムの開始番地の指定 ;*********************************************************** ; 入出力ピン初期化 ;*********************************************************** BSF STATUS,RP0 ; Bank 1 へ切替 MOVLW B'10001110' ; RA0のみアナログ、結果右詰 MOVWF ADCON1 ; ADCON1レジスタの設定 CLRF TRISB ; PortB 出力モードに設定 CLRF TRISD ; PortD 出力モードに設定 BCF STATUS,RP0 ; Bank 0 へ戻す ; MOVLW B'10000001' ; Fosc/32,CH0 設定, A/D on MOVWF ADCON0 ; ADCON0レジスタの設定 ;*********************************************************** ; メインプログラム ;*********************************************************** ADSTART CALL TIME ; 23.2μs 一定時間待つ ; (2TAD [2×1.6μs]+アクィジション時間[20μs]) BSF ADCON0,GO ; A/D スタート WAIT ; A/D が完了すると GOが0になる BTFSC ADCON0,GO ; GO が 0 だったらループから抜ける GOTO WAIT ; GO が 1 だったら WAIT へループする MOVF ADRESH,W ; A/D データ上位(データは右詰) MOVWF PORTB ; PortBへ A/D 結果を出力 BSF STATUS,RP0 ; Bank 1 へ切替 MOVF ADRESL,W ; A/D データ下位 BCF STATUS,RP0 ; Bank 0 へ戻す MOVWF PORTD ; PortDへ A/D 結果を出力 GOTO ADSTART ; A/D 変換を繰り返す ;*********************************************************** ;23μs遅延サブルーチン(20MHzクロック時) ;*********************************************************** TIME MOVLW 25H ; 1サイクル 25H = 37 MOVWF COUNT ; 1サイクル NOP ; 1サイクル 微調整ダミー LOOP DECFSZ COUNT,F ; 1×(37-1)+2 = 38サイクル GOTO LOOP ; 2×(37-1) = 72サイクル RETURN ; 2サイクル ; 合計 115サイクル×0.2μs = 23μs END